package com.app.Network;

import java.util.ArrayList;
import java.util.Iterator;

import com.app.Activity.frmBieuQuyetMoiRoiNhom;
import com.app.Activity.frmMainActivity;
import com.app.Activity.trucActivity;
import com.app.Activity.frmNhomChoActivity;
import com.app.Activity.frmNotificationMoiVaoNhom;
import com.app.Activity.frmPhuActivity;
import com.app.Activity.trucActivity;
import com.app.Controller.ActivityController;
import com.app.Controller.NetworkController;
import com.app.Controller.ReadWriteFileController;
import com.app.DTO.AccountDTO;
import com.app.DTO.RoleDTO;

import ReadWriteXML.CMember;
import android.os.Handler;
import android.util.Log;
import it.unipr.ce.dsg.s2p.org.json.JSONException;
import it.unipr.ce.dsg.s2p.org.json.JSONObject;
import it.unipr.ce.dsg.s2p.peer.Peer;
import it.unipr.ce.dsg.s2p.peer.PeerDescriptor;
import it.unipr.ce.dsg.s2p.sip.Address;

public class NetworkLayer extends Peer {
	private Handler hander = new Handler();
	public AccountDTO account = null;

	public AccountDTO getAccount() {
		return this.account;
	}

	public PeerDescriptor getPeerDescriptor() {
		return this.peerDescriptor;
	}

	public NetworkLayer(String pathConfig, String key, String peerName, int peerPort, AccountDTO account) {
		super(pathConfig, key, peerName, peerPort);
		this.account = account;
	}

	@Override
	protected void onDeliveryMsgFailure(String arg0, Address arg1, String arg2) {
		// TODO Auto-generated method stub

	}

	@Override
	protected void onDeliveryMsgSuccess(String arg0, Address arg1, String arg2) {
		// TODO Auto-generated method stub

	}

	@Override
	protected void onReceivedJSONMsg(JSONObject peerMsg, Address sender) {
		JSONObject params = null;
		Log.d("Phu", "onReceivedJSONMsg");
		try {
			params = peerMsg.getJSONObject("payload").getJSONObject("params");
		} catch (JSONException e) {

			e.printStackTrace();
			Log.d("Loi", "Lỗi onReceivedJSONMsg try 1");
		}
		try {
			String type = (String) peerMsg.get("type");
			Log.d("Phu", "type: " + type+" from: "+sender.toString());
			// ===============truc====================================
			// cam noi
			if (type.equals(Protocol.STOP_TALKING_ONE_MEMBER)) {

				account.getRule().get(1).setSend(false);
				Log.d("Phu", "moi sua: Send " + account.getRule().get(0).getSend());
				NetworkController.ShowMessageNotice(Protocol.STOP_TALKING_MESSAGE);

			}// tao lao
			else if (type.equals(Protocol.HELLO)) {
				NetworkController.ShowMessageNotice("Da nhan hello");
			}
			// cho noi
			else if (type.equals(Protocol.ACCEPT_TALKING_ONE_MEMBER)) {
				account.getRule().get(1).setSend(true);
				Log.d("Phu", "Da sua lai wuyen noi" + account.getRule().get(0).getSend());
				NetworkController.ShowMessageNotice(Protocol.ACCEPT_TALKING_MESSAGE);
			}// chat
			else if (type.equals(Protocol.CHAT_MESSAGE)) {
				String key;
				if (account.getRule().get(0).getReceive()) {
					Iterator<String> listKey = params.keys();
					while (listKey.hasNext()) {
						key = listKey.next();
						String s = null;
						try {
							s = params.get(key).toString();
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						if (key.equals("Content_Chat")) {
							NetworkController.ShowMessageChat(s, sender.toString());
							Log.d("Phu", "Da show noi dung chat nhan dc");
						}
					}
				} else {
					Log.d("Phu", "gui phan hoi ko chat net layer");
					NetworkController.ShowMessageNotice("ban ko co quyen nhan tin nhan chat");
					NetworkController.GuiPhanHoiKhongCoQuyenChat(sender);
				}
			}// ko co quyen nhan tin nhan chat
			else if (type.equals(Protocol.CHAT_FEDBACK_NON_RULE)) {
				NetworkController.ShowMessageNotice("Doi phuong ko co quyen nhan tin nhan chat");
			}// nhan tin nhan yeu cau bieu quyet moi nguoi khac ra khoi nhom
			else if (type.equals(Protocol.KICK_MEMBER_OUT_MESSAGE)) {
				Log.d("Phu", "vao nhan vote");
				frmBieuQuyetMoiRoiNhom.senderKick = sender;				
				String key;
				int time = 0;
				String ipBeingKick = "";
				String ip = getAddressPeer();
				Log.d("Phu", "my ip " + ip);
				Iterator<String> listKey = params.keys();
				while (listKey.hasNext()) {
					key = listKey.next();
					String s = null;
					try {
						s = params.get(key).toString();
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					if (key.equals("Time")) {
						time = Integer.parseInt(s);
					}
					if (key.equals("IPBeingKick")) {

						ipBeingKick = s;
					}
				}
				trucActivity.timeVoteKick = time;
				frmBieuQuyetMoiRoiNhom.timeVoteKick=time;
				Log.d("Phu", "time to vote = " + time);
				if (ip.equals(ipBeingKick) == false) {
					Log.d("Phu", "Hien thi man hinh kick");
					NetworkController.DislayVoteKickMember();
				} else {
					Log.d("Phu", "khop ip trong send vote");
					NetworkController
							.ShowMessageNotice("Các thành viên trong nhóm đang biểu quyết để mời bạn rời khỏi nhóm.");
					// phai phong truong hop no nhan duoc thong bao nay tu nhien
					// roi khoi nhom.ko cho quyet dinh.
					Log.d("Phu", "Da show thong bao ");
				}

			}// nhan duoc phan hoi moi nguoi khac ra khoi nhom
			else if (type.equals(Protocol.KICK_MEMBER_OUT_FEDBACK)) {
				Log.d("Phu", "vao fan hoi vote");
				NetworkController.ShowMessageNotice("da nhan dc tin nhan phan hoi Kick");
				String key;

				Iterator<String> listKey = params.keys();
				while (listKey.hasNext()) {
					key = listKey.next();
					String s = null;
					try {
						s = params.get(key).toString();
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					if (key.equals("VOTE")) {
						Log.d("Phu", "lay vote");
						if (s.equals("1")) {
							trucActivity.yesVote.add(1);
						} else if (s.equals("0")) {
							trucActivity.noVote.add(1);
						}
					}
				}
			}// nhan dc ket qua cuoi dung
			else if (type.equals(Protocol.KICK_MEMBER_OUT_RESULT)) {
				NetworkController.ShowMessageNotice("da nhan dc ket qua Kick");
				String key;
				int kq = -1;
				Iterator<String> listKey = params.keys();
				Address myIP = getAddress();
				String ipBeingKick = "";
				while (listKey.hasNext()) {
					key = listKey.next();
					String s = null;
					try {
						s = params.get(key).toString();
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					if (key.equals("Result")) {
						Log.d("Phu", "lay ket qua cuoi cung");
						if (s.equals("1")) {
							// NetworkController.ShowMessageNotice("Thành viên trên đã bị mời khỏi nhóm");
							kq = 1;
						} else if (s.equals("0")) {
							kq = 0;
							// NetworkController.ShowMessageNotice("Mời thành viên khỏi nhóm đã thất bại.");
						}
						Log.d("Phu", "ket qua cuoi cung = " + s);
					}

					if (key.equals("BeingKick")) {
						Log.d("Phu", "lay ip bi kick result");
						Log.d("Phu", "ip bi kick result : " + s);
						ipBeingKick = s;
						// Log.d("Phu","My ip result : "+myIP.getURL());

					}

				}
				if (ipBeingKick.equals(myIP.getURL())) {
					Log.d("Phu", "khop ip bi kick result");
					if (kq == 1) {
						Log.d("Phu", "kq bi kick result =1 ");
						NetworkController.ShowMessageNotice("Bạn đã bị mời khỏi nhóm.");
						// xoa nguoi nay khoi danh sach nhom
						NetworkController.CloseActivity();
					} else {
						Log.d("Phu", "kq bi kick result =0 ");
						NetworkController.ShowMessageNotice("Các thành viên mời bạn rời khỏi nhóm đã thất bại.");
					}
				} else {
					Log.d("Phu", "khop ip bi kick result");
					if (kq == 1) {
						Log.d("Phu", "kq bi kick result =1 ");
						NetworkController.ShowMessageNotice("Thành viên trên đã bị mời khỏi nhóm.");
					} else {
						Log.d("Phu", "kq bi kick result =0 ");
						NetworkController.ShowMessageNotice("Mời thành viên khỏi nhóm đã thất bại.");
					}

				}

			}

			// ==================Phú==========================================

			// Nhận đc gói tin mời vào nhóm
			else if (type.equals(Protocol.GROUP_INVITE)) {
				Log.d("nhan", "nhan dc: " + type);
				if (account.getRule().get(0).getReceive()) {
					final String contentTitle = params.getString(Protocol.GROUP_INVITE_DATA_GROUP_NAME);
					final String contentText = params.getString(Protocol.GROUP_INVITE_DATA_MSG);
					final Address nguoiGui=sender;
					hander.post(new Runnable() {
						@Override
						public void run() {
							// ActivityController.setPeerActivity(frmPhuActivity.this);
							// ActivityController.showNotification("Có người mời bạn vào nhóm!",
							// contentTitle, contentText);
							NetworkController.sender=nguoiGui;
							ActivityController.showMoiVaoNhomNotification(contentText, contentTitle);
							Log.d("phu", "HIen thi showMoiVaoNhomNotif ");
						}
					});

				} else {

				}
			}
			// Đồng ý vào nhóm
			else if (type.equals(Protocol.GROUP_INVITE_REPLY_YES)) {
				// Kiểm tra tình trạng nhóm xem có vào đc ko - gửi msg từ chối/
				// cho phép vào nóm
				if (frmNhomChoActivity.groupFull) {
					Log.d("phu", "Nhom da full - ko cho vao nhom");
					NetworkController.sendKhongChoVaoNhom(sender);
				} else {
					Log.d("phu", "Cho vao nhom ");
					Log.d("phu", "host: " + sender.getHost());
					NetworkController.sendChoVaoNhom(sender);
					//hander.post(frmPhuActivity.raUpdateNguoiTrongNhom);
				}
			}
			// Không thể vào nhóm - hiện thông báo ko thể vào nhóm
			else if (type.equals(Protocol.GROUP_INVITE_NO)) {
				Log.d("phu", "Ko the vao nhóm ");
				hander.post(frmPhuActivity.raKhongDuocVaoNhom);
			}
			// Có thể vào nhóm -gửi msg join_group
			else if (type.equals(Protocol.GROUP_INVITE_YES)) {
				Log.d("phu", "Có thể vào nhóm");
				// hander.post(frmPhuActivity.raDaVaoNhom);
				hander.post(frmNotificationMoiVaoNhom.raStarNhomCho);
				NetworkController.sendJoinGroup(sender, account.get_Username(), account.get_Username());
			}
			// nhận đc tin Vào nhóm - Cập nhật lại member list -
			//  gửi tin cập nhật cho tất cảthành viên
			// Gửi danh sách thành viên cho thằng mới vào
			else if (type.equals(Protocol.JOIN_GROUP)) {
				// Lấy thông tin của member mới vào
				String IP = sender.toString();
				String userName = params.getString(Protocol.MEMBER_USER_NAME);
				String fullName = params.getString(Protocol.MEMBER_FULL_NAME);
				final CMember member = new CMember(IP, fullName, userName);
				
				
				// Cập nhật danh sách member
				hander.post(new Runnable() {
					@Override
					public void run() {
						Log.d("Phu", "onRecive Json Cập nhật danh sách member");
						frmNhomChoActivity.insertMember(member);						
					}
				});
			
				final ArrayList<CMember> memberList = ReadWriteFileController
				.readMember(ReadWriteFileController.MEMBER_PATH);
				Log.d("Phu","DS TV: "+CMember.toParseList(memberList));
				//Gửi danh sách thành viên cho thằng mới vào
				hander.post(new Runnable() {					
					@Override
					public void run() {
						NetworkController.sendMemberList(new Address(member.get_ip()), memberList);
					}
				});				
				
				// Gửi thông tin cập nhật cho các thành viên 				
				for (int i = 0; i < memberList.size(); i++) {
					 {
						final int j = i;
						hander.post(new Runnable() {
							@Override
							public void run() {								
								NetworkController.sendUpdateMember(new Address(memberList.get(j).get_ip()), member);
							}
						});
					}
				}
				hander.post(frmNhomChoActivity.raRefreshListView);
			}
			//Cập nhật member (insert thêm 1 thành viên)
			else if(type.equals(Protocol.UPDATE_MEMBER_LIST)){
				final String s=params.getString(Protocol.UPDATE_MEMBER_LIST);				
				hander.post(new Runnable() {					
					@Override
					public void run() {
						frmNhomChoActivity.insertMember(CMember.parse(s));						
					}
				});
				hander.post(frmNhomChoActivity.raRefreshListView);
			}
			//Ghi danh sách thành viên xuống file - Hiện màn hình chờ nhóm
			else if(type.equals(Protocol.MEMBER_LIST)){
				final String s=params.getString(Protocol.MEMBER_LIST);				
				ReadWriteFileController.writeMember(ReadWriteFileController.MEMBER_PATH,CMember.parseList(s));
				hander.post(frmNhomChoActivity.raRefreshListView);
				Log.d("Phu","Da mo man hinh Cho nhom trong network");
			}
			// Set role
			else if (type.equals(Protocol.SET_ROLE)) {
				String data = "";
				Iterator<String> iter = params.keys();
				while (iter.hasNext()) {
					String key = iter.next();					
					if (key.equals("DATA")) {
						try {
							data = params.getString(key);
							Log.d("Phu", "data:" + data);
							break;
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}

					}
				}
				final String s = data;
				hander.post(new Runnable() {

					@Override
					public void run() {
						// NetworkController._peer.account.set/
						String path = ReadWriteFileController.MY_ROLE_PATH;
						ReadWriteFileController.writeRole(path,
								RoleDTO.parseList(s, ReadWriteFileController.RULE_BASE_PATH));
						NetworkController.resetRole();

					}
				});
			}
			//-----------------------An-----
			else if (type.equals(Protocol.GROUP_SIGN_OUT)){
				Log.d("PEERDROID", "da nhan tin nhan request sign out");
				hander.post(new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						Log.d("phu", "da nhan sign out");
						ActivityController.ShowSignOut();
					}
				});
			}else if (type.equals(Protocol.GROUP_DANH_GIA)){
				hander.post(new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						ActivityController.ShowDanhGia();
					}
				});
			}
			else if (type.equals(Protocol.GROUP_BIEU_QUYET)){
				Log.d("PEERDROID", "da nhan tin nhan request bieu quyet");
				NetworkController.ReceiveBieuQuyet(params, sender);
			}
			else if (type.equals(Protocol.RESULT_DANH_GIA)){
				Log.d("PEERDROID", "da nhan tin nhan ket qua danh gia");
				NetworkController.ReceiveResultDanhGia(params, sender);
			}
			else if (type.equals(Protocol.RESULT_BIEU_QUYET)){
				Log.d("PEERDROID", "da nhan tin nhan ket qua bieu quyet");
				NetworkController.ReceiveResultBieuQuyet(params, sender);
			}
		} catch (Exception e) {
			// TODO: handle exception
			Log.d("Loi", "Loi trong ham nhận message");
		}

	}

	public String getAddressPeer() {

		return getAddress().getURL();
	}

	public String getContactAddressPeer() {

		return peerDescriptor.getContactAddress();
	}

	private boolean nhomDaFull() {
		return true;
	}
}
